package org.jeecg.modules.geo.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.core.constant.YesOrNotEnum;
import org.jeecg.modules.geo.entity.BimGeoEvent;
import org.jeecg.modules.geo.mapper.BimGeoEventMapper;
import org.jeecg.modules.geo.service.IBimGeoEventService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;

/**
 * @Description: bim_geo_event
 * @Author: jeecg-boot
 * @Date:   2022-12-05
 * @Version: V1.0
 */
@Service
public class BimGeoEventServiceImpl extends ServiceImpl<BimGeoEventMapper, BimGeoEvent> implements IBimGeoEventService {

    @Override
    public void add(BimGeoEvent bimGeoEvent) {
        BimGeoEvent geoEvent = this.findOneVerify(bimGeoEvent);
        if (geoEvent != null) {
            log.error("添加事件信息失败，事件信息已存在！param=" + bimGeoEvent);
            throw new JeecgBootException("添加事件信息失败，事件信息已存在！");
        }
        BimGeoEvent nameVerify = this.findOneVerify(bimGeoEvent.getAppId(), bimGeoEvent.getEventName());
        if (nameVerify != null) {
            throw new JeecgBootException("添加事件信息失败，与该应用下其他事件重名！");
        }
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        bimGeoEvent.setCreateUserId(user.getId());
        bimGeoEvent.setCreateTime(new Date());
        bimGeoEvent.setDelFlag(YesOrNotEnum.N.getCode());
        this.save(bimGeoEvent);
    }

    @Override
    public void update(BimGeoEvent bimGeoEvent) {
        if (StringUtils.isEmpty(bimGeoEvent.getId())) {
            log.error("修改事件信息失败，id不能为空");
            throw new JeecgBootException("修改事件信息失败，id不能为空");
        }
        BimGeoEvent geoEvent = this.findOneVerify(bimGeoEvent);
        if (geoEvent != null && (!bimGeoEvent.getId().equals(geoEvent.getId()))) {
            log.error("修改事件信息失败，更新内容已存在！param=" + bimGeoEvent);
            throw new JeecgBootException("修改事件信息失败，更新内容已存在！");
        }
        BimGeoEvent nameVerify = this.findOneVerify(bimGeoEvent.getAppId(), bimGeoEvent.getEventName());
        if (nameVerify != null && (!bimGeoEvent.getId().equals(nameVerify.getId()))) {
            throw new JeecgBootException("修改事件信息失败，与该应用下其他事件重名！");
        }
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        bimGeoEvent.setUpdateUserId(user.getId());
        bimGeoEvent.setUpdateTime(new Date());
        this.updateById(bimGeoEvent);
    }

    @Override
    public void logicDelete(String id) {
        if (StringUtils.isEmpty(id)) {
            log.error("删除事件信息失败，id不能为空");
            throw new JeecgBootException("删除事件信息失败，id不能为空");
        }
        BimGeoEvent bimGeoEvent = new BimGeoEvent();
        bimGeoEvent.setId(id);
        bimGeoEvent.setDelFlag(YesOrNotEnum.Y.getCode());
        this.update(bimGeoEvent);
    }

    @Override
    public List<BimGeoEvent> findList(Integer appId) {
        LambdaUpdateWrapper<BimGeoEvent> queryWrapper = new LambdaUpdateWrapper<>();
        queryWrapper.eq(BimGeoEvent::getAppId, appId)
                .eq(BimGeoEvent::getEnableFlag, YesOrNotEnum.Y.getCode())
                .eq(BimGeoEvent::getDelFlag, YesOrNotEnum.N.getCode());
        return this.getBaseMapper().selectList(queryWrapper);
    }

    private BimGeoEvent findOneVerify(String appId, String eventName){
        LambdaUpdateWrapper<BimGeoEvent> queryWrapper = new LambdaUpdateWrapper<>();
        queryWrapper.eq(BimGeoEvent::getAppId, appId)
                .eq(BimGeoEvent::getEventName, eventName)
                .eq(BimGeoEvent::getDelFlag, YesOrNotEnum.N.getCode());
        List<BimGeoEvent> bimGeoEvents = this.getBaseMapper().selectList(queryWrapper);
        return CollectionUtils.isEmpty(bimGeoEvents) ? null : bimGeoEvents.get(0);
    }

    private BimGeoEvent findOneVerify(BimGeoEvent bimGeoEvent){
        LambdaUpdateWrapper<BimGeoEvent> queryWrapper = new LambdaUpdateWrapper<>();
        queryWrapper.eq(BimGeoEvent::getAppId, bimGeoEvent.getAppId())
                .eq(BimGeoEvent::getType, bimGeoEvent.getType())
                .eq(BimGeoEvent::getOperateType, bimGeoEvent.getOperateType())
                .eq(BimGeoEvent::getMouseEventType, bimGeoEvent.getMouseEventType())
                .eq(BimGeoEvent::getDelFlag, YesOrNotEnum.N.getCode());
        List<BimGeoEvent> bimGeoEvents = this.getBaseMapper().selectList(queryWrapper);
        return CollectionUtils.isEmpty(bimGeoEvents) ? null : bimGeoEvents.get(0);
    }

}
